package vista;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.ScrollPane;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JViewport;

import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import com.sun.org.apache.xerces.internal.parsers.SAXParser;

import control.mapa.ControladorMouseRegion;
import control.ventana.ControladorNoMover;

import juego.Juego;

import manejoArchivos.ManejadorUIMapa;
import mapas.Mapa;

/**
 * @author Grupo 2, Algoritmos y programacion 3, Catedra Fontela<br>1er cuat 2007    
 * <br> Esta clase se encarga de representar la vista del mapa.
 */

public class VistaMapa extends JInternalFrame implements Observer {
	
	private Mapa modelo;
	private JScrollPane scroller;
	private JLayeredPane panelMapa;
	private JLabel imagenFondo;
	private ArrayList regiones;
		
	public VistaMapa(String nombreVista, String ruta){
		//llamo al contructor de l padre y seteo las propiedades
		super(nombreVista,false,false,false,false);
		this.setResizable(false);
		Dimension tamanoPantalla = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBackground(Color.black);
		this.setBounds(200,0,tamanoPantalla.width - 205, new Integer(2 * tamanoPantalla.height / 3));
		this.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
		//agrego un controlador para que no se pueda mover con el mouse
		this.addComponentListener(new ControladorNoMover(this.getX(), this.getY()));
		//agrego el modelo y cargo el contenido
		modelo = Juego.getInstance().getMapa();
		modelo.addObserver(this);
		this.setVisible(true);
		this.regiones = new ArrayList();
		
		if(ruta!= null)
			cargarContenido(ruta);
	}
	public void agregarVistaRegion(VistaRegion vRegion){
		//this.scroller.add(vRegion);
		//scroller.setComponentZOrder(vRegion, 0);
		((ImagenMapa)this.imagenFondo).agregarVistaRegion(vRegion);
		regiones.add(vRegion);
	}
	public void setImagenFondo(String ruta){
		Dimension tamanoPantalla = Toolkit.getDefaultToolkit().getScreenSize();
		imagenFondo = new ImagenMapa(ruta);
		
		scroller = new JScrollPane(imagenFondo);
		scroller.setSize(this.getWidth(),this.getHeight());
		scroller.setVisible(true);
		scroller.setBackground(Color.blue);
		imagenFondo.addMouseListener(new ControladorMouseRegion(modelo, this));
		this.add(scroller);
	}
	private void cargarContenido(String ruta) {
		XMLReader parser = new SAXParser();
		parser.setContentHandler(new ManejadorUIMapa(this, modelo));
		try {
			parser.parse(ruta);
		} catch (IOException e) {
			
			e.printStackTrace();
		} catch (SAXException e) {
			
			e.printStackTrace();
		}
		
	}
	/**
	 * Busca la vista region que contenga a un punto determinado
	 * @param p Punto donde se desea encontrar un poligono
	 * @return La vista region encontrada, de lo contrario devuelve null.
	 */
	public VistaRegion getPoligonoEn(Point p){
		int i = 0;
		boolean encontrado = false;
		while(i<regiones.size() && !encontrado){
			if( ((VistaRegion)regiones.get(i)).getPolygon().contains(p) == true)
				encontrado = true;
			else
				i++;
		}
		if(encontrado)
			return (VistaRegion)regiones.get(i);
		else
			return null;
	}
	private void actualizarImagenFondo(){
		imagenFondo.repaint();
	}
	public void update(Observable arg0, Object arg1) {
		actualizarImagenFondo();

	}

}
